ποΈGitΠ―ΡΠ°ποΈ
docs/en/developer/contributing.md 2d20cd8a4708e2ef66e98d5259f3a97ec93f240a (2d20cd8a) Text, 3.27 KB
title: Contributing
parent: Developer Guide
nav_order: 8
last_updated: 2026-07-08
aliases:
β’ contributing
β’ pull-request
β’ branch-naming
Contributing
Guidelines for contributing to the Meshtastic Android/Desktop project (a KMP codebase that also compiles for iOS).
Branch Naming
Branches use conventional-commit style prefixes:
ββββββββββββββββββββ¬βββββββββββββββββββββββββββββ
β Prefix β Use for β
ββββββββββββββββββββΌβββββββββββββββββββββββββββββ€
β T383838feat/<scope> β New user-visible behavior β
β T383838fix/<scope> β Bug fixes β
β T383838refactor/<scope> β Code structure changes β
β T383838chore/<scope> β Tooling, deps, CI, cleanup β
β T383838docs/<scope> β Documentation only β
β T383838build/<scope> β Build system changes β
β T383838ci/<scope> β CI workflow changes β
β T383838test/<scope> β Test additions or fixes β
β T383838deps/<scope> β Dependency updates β
ββββββββββββββββββββ΄βββββββββββββββββββββββββββββ
Timestamp-based spec prefixes (T383838YYYYMMDD-HHMMSS-feature-name, as created by T383838/speckit.git.feature) are also valid for spec-driven work.
Examples:
β’ T383838feat/desktop-ble-transport
β’ T383838fix/bluetooth-reconnect
β’ T38383820260601-074653-air-quality-telemetry
Development Workflow
1. Fork the repository (external contributors) or create a branch (maintainers).
2. Implement your changes following the architecture guidelines.
3. Test locally: T383838./gradlew spotlessCheck detekt kmpSmokeCompile test allTests
4. Commit with clear, descriptive messages.
5. Push and open a Pull Request.
Commit Messages
Follow conventional commit style:
T282828
feat(docs): add in-app documentation browser
fix(ble): handle reconnection timeout
refactor(navigation): migrate to typed routes
test(search): add keyword ranking tests
Pull Request Checklist
Before submitting:
β’ [ ] Code compiles on all targets: T383838./gradlew kmpSmokeCompile
β’ [ ] All tests pass: T383838./gradlew allTests
β’ [ ] Code style passes: T383838./gradlew spotlessCheck
β’ [ ] Static analysis passes: T383838./gradlew detekt
β’ [ ] New code has appropriate test coverage
β’ [ ] No T383838android.* imports in T383838commonMain
β’ [ ] Koin modules registered if new DI is added
β’ [ ] Routes added to T383838Routes.kt if new navigation is introduced
β’ [ ] Documentation updated if user-facing behavior changes
Code Style
β’ Formatting: Enforced by Spotless (KtLint rules)
β’ Static analysis: Detekt with project-specific configuration
β’ Imports: No wildcard imports; organized automatically by Spotless
β’ Line length: 120 characters maximum
Run formatting:
T282828
./gradlew spotlessApply
Architecture Rules
β’ Feature modules must not depend on other feature modules
β’ T383838commonMain must not contain T383838android.*, T383838java.io.*, or platform-specific imports
β’ Prefer interface + DI over T383838expect/T383838actual for complex platform behaviors
β’ All navigation routes must be T383838@Serializable and defined in T383838Routes.kt
β’ Use Koin annotations (T383838@Single, T383838@Factory, T383838@Module) for dependency injection
Verification
Full pre-merge verification:
T282828
./gradlew spotlessCheck detekt kmpSmokeCompile Tffa657test allTests
For docs-specific changes, also run:
T282828
./gradlew generateDocsBundle validateDocsBundle
Getting Help
β’ Meshtastic Discord β T383838#app-development channel
β’ GitHub Issues β for bug reports and feature requests
β’ GitHub Discussions β for questions and ideas
Served by rngit 1.5.0 - Generated in 0.13s